/*
 * @lc app=leetcode.cn id=3 lang=javascript
 *
 * [3] 无重复字符的最长子串
 */

// @lc code=start
/**
 * 先找出所有不包含重复字符串的子串
 * 找出长度最大的那个返回长度即可
 * 1. 用双指针维护一个滑动窗口，用来剪切子串
 * 2. 不断移动右指针，遇到重复字符，就把左指针移动到重复字符到下一位
 * 3. 移动过程中，记录所有窗口长度
 * 4. 所有窗口长度的最大值返回
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
  let l = 0;
  let res = 0;
  const map = new Map();

  for (let r = 0; r < s.length; r++) {
    // 判断是不是重复字符
    if (map.has(s[r]) && map.get(s[r]) >= l) {
      // 如果是 则左指针放在重复字符的下一位
      l = map.get(s[r]) + 1;
    }
    // 记录当前元素及其坐标，便于【判断是不是重复字符】逻辑
    map.set(s[r], r);
    // 比较当前的窗口长度和之前的最大窗口长度，取最大值
    res = Math.max(res, r - l + 1);
  }
  return res;
};
// @lc code=end
